package onjava.generics;

// generics/IterableFibonacci.java
// (c)2021 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Adapt the Fibonacci class to make it Iterable
import java.util.*;

/**
 * 泛型接口 -> 迭代器
 * 斐波那契数列, 通过继承实现适配器(Adapter)类
 *
 * @author Lucky Yang
 */
public class IterableFibonacci
    extends Fibonacci implements Iterable<Integer> {
  private int n;

  public IterableFibonacci(int count) {
    n = count;
  }

  @Override
  public Iterator<Integer> iterator() {
    return new Iterator<Integer>() {
      @Override
      public boolean hasNext() {
        return n > 0;
      }

      @Override
      public Integer next() {
        n--;
        return IterableFibonacci.this.get();
      }

      @Override
      public void remove() { // Not implemented
        throw new UnsupportedOperationException();
      }
    };
  }

  public static void main(String[] args) {
    int size = 18;
    for (int i : new IterableFibonacci(size)) {
      System.out.print(i + " ");
    }
  }
}
/*
 * Output:
 * 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
 * 2584
 */
